package top.xia17.plugins.fast.common.database;

import java.util.HashMap;
import java.util.Map;

/**
 * 增删改查service扩展的上下文存储
 * 作用是在各种操作的生命周期中可以共享一个变量
 * 比如在createBefore中有计算出一个变量需要在createAfter后调用，此时便可以使用这里面的方法。
 *
 * @author xia17
 * @since 2022/3/5 0:36
 */
public class CrudServiceExpandContext {

    /**
     * 将变量存在threadLocal中
     */
    private final ThreadLocal<Map<String, Object>> context = new ThreadLocal<>();

    /**
     * 初始化
     */
    private void initContext() {
        context.set(new HashMap<>(4));
    }

    /**
     * 清除threadLocal中的内容
     */
    public void clearContext() {
        context.remove();
    }

    /**
     * 获取上下文属性
     * 在第一次调用这个方法时进行初始化
     *
     * @return /
     */
    public Map<String, Object> getAttributes() {
        if (context.get() == null) {
            this.initContext();
        }
        return context.get();
    }

    /**
     * 设置上下文属性
     *
     * @param key   key
     * @param value value
     */
    public void setAttribute(String key, Object value) {
        this.getAttributes().put(key, value);
    }

    /**
     * 获取上下文属性
     *
     * @param key key
     * @return 返回值，可以为null
     */
    public Object getAttribute(String key) {
        return this.getAttributes().get(key);
    }

    /**
     * 获取上下文属性，进行强转返回
     *
     * @param key key
     * @param <E> 泛型，用于强制转化为想要返回的类型
     * @return 返回值，可以为null
     */
    @SuppressWarnings("all")
    public <E> E getAttributeBean(String key) {
        Object obj = this.getAttributes().get(key);
        return obj == null ? null : (E) obj;
    }

}
